

/// <reference path="./../Define.ts" />
/// <reference path="./../module/ModuleMgr.ts" />
/// <reference path="./../module/BaseModule.ts" />

namespace apeng {

    export interface IConfigBase {
        /**当前的ID */
        id: number
        /**配置表名称 */
        configName: string
    }

    export interface IConfigLanguage extends IConfigBase {
        chinese: string,
        traditional: string,
        english: string,
    }

    /**一个物体的基本属性 */
    export interface IConfigItemBase extends IConfigBase {
        /**图标路径 */
        icon_url: string
        /**名字 */
        id_name: number
        /**描述 */
        id_describe: number
    }

    export interface IConfigPlatform extends IConfigBase {
        banner: string,
        interstitial: string[],
        nativeTemp: string,
        rewardedVideo: string,
        native: string
        appid: string,
        /**每天第一次播放使用 */
        rewardedVideoOnce: string,
        bannerUpdate: string,
        blockOnce: string,
        blockOnceUpdate: string
    }

    export interface IConfigCountBase {
        /**默认数量 */
        default_count: number
        /**最大数量 -1 无限制 */
        max_count: number
    }


    export interface IConfigProp extends IConfigItemBase, IConfigCountBase {
        /**自动恢复间隔时间 */
        auto_resume: [
            /**自动恢复间隔时间 分 -1不开启 */
            number,
            /**自动恢复间隔增加数量 */
            number,
            /**自动恢复 离线恢复  0不启动*/
            number
        ],
        /**获得道具时ui界面icon路径 */
        add_other_icon_url: string,
        /**1在背包展示 */
        is_package_show: number,
        /**是否播放飞行特效 */
        is_fly: number,
        /**第二天是否恢复上限 */
        is_refull: number,
        /**公共获取弹窗（每日看视频最大次数；看视频增加数量；使用多少钻石可兑换；钻石增加数量；看视频icon；钻石icon；title路径） */
        add_ui: any[]
    }

    export interface IConfigDefineBase {
        /**主配置表 */
        main: any
        /**平台配置表 */
        platform: IConfigPlatform
        /**语言表 */
        language: IConfigLanguage
        /**道具表 */
        prop: IConfigProp
    }

    export class ConfigHelper<T extends IConfigDefineBase> {
        /**数组形式的配置数据 */
        public readonly arr: { [Key in keyof T]: T[Key][] } = <any>{}
        /**对象形式的配置数据 */
        public readonly obj: { [Key in keyof T]: { [id: number]: T[Key] } } = <any>{}

        public constructor(configs: Object, define: Object) {
            let objs = this.deParse(configs)
            // 解析配置表
            for (let configName in define) {
                let obj: any = objs[configName]
                this.arr[configName] = []
                if (configName.indexOf("language") != -1) {
                    for (let key in obj)
                        this.arr[configName].push(obj[key])
                }
                else {
                    for (let key in obj) {
                        obj[key].id = Number(key)
                        obj[key].configName = configName
                        this.arr[configName].push(obj[key])

                        let parseKey = (define as any)[configName]
                        if (parseKey !== null!)
                            obj[key] = (obj[key] as any)[parseKey]
                    }
                }
                this.obj[configName] = obj
            }
        }

        // 解压缩
        private deParse(sources: any) {
            let obj: any = {}
            for (let key in sources) {
                let value: any = null!
                if (key.indexOf("language") != -1) {
                    value = sources[key][1]
                    for (let _k in value) {
                        for (let i = 0; i < value[_k].length; i++) {
                            let v = value[_k][i]
                            if (v && typeof v == "string")
                                value[_k][i] = v.split("\\n").join("\n")
                            else
                                value[_k][i] = v + ""
                        }
                    }
                }
                else {
                    value = {}
                    let k = []
                    for (let _k of sources[key][0])
                        k.push(_k)
                    let v = sources[key][1]
                    for (let _k in v) {
                        value[_k] = {}
                        for (let i = 0; i < k.length; i++)
                            value[_k][k[i]] = v[_k][i]
                    }
                }
                obj[key] = value
            }
            return obj
        }
    }
}